<?php
/*
 * @Author: liujiachen liujiachen@neuedu.com
 * @Date: 2024-09-11 13:26:26
 * @LastEditors: liujiachen liujiachen@neuedu.com
 * @LastEditTime: 2024-09-11 15:50:05
 * @FilePath: \WWW\phpcode\imgcode\imgcode.php
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */


/**
 * 封装生成随机字符串的方法
 * @param number  // $length获取随机字符串的长度
 * @return string 返回一个随机字符串
 */
function randstr($length = 4)
{
    $str = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $rand = str_shuffle($str); //可以随机打乱一个字符串
    return substr($rand, 0, $length);
}
// 设置验证码盒子的宽高
$width = 200;
$height = 80;

//创建一个彩色的图片对象(透明的颜色)
$img = imagecreatetruecolor($width, $height);

//创建背景颜色
$bgr = mt_rand(0, 255);
$bgg = mt_rand(0, 255);
$bgb = mt_rand(0, 255);
 //设置背景颜色,颜色必须使用rgb格式
$bgcolor = imagecolorallocate($img, $bgr, $bgg, $bgb);

//将背景色填充到图片上(以矩形的方式填充)
imagefilledrectangle($img, 0, 0, $width, $height, $bgcolor);

//生成随机数
$imgcode = "";

//循环4次
for($i = 0; $i<4; $i++)
{
    $code = randstr(1); //单个字符
    $imgcode .= $code; //将单个字符 组装到一个字符串中

    // 文字颜色
    $textr = mt_rand(0, 255);
    $textg = mt_rand(0, 255);
    $textb = mt_rand(0, 255);
    $textcolor = imagecolorallocate($img, $textr, $textg, $textb);

    //字体路径 
    /* 验证码   字体 加载不了的   把 $font 变量路径 改成 绝对路径试一下
    D:/phpstudy_pro/WWW/phpcode/具体的字体文件名 像这样的绝对路径 
    注意是 左斜杠(/)
    */
    $font = "D:/phpstudy_pro/WWW/phpcode/imgcode/font.ttf";
    // $font = "./zh.ttf";

    // $angle = mt_rand(0, 360);
    $x = 33 * ($i + 1);

    // $code = "中";

    //将字符串写到图片上
    //第一个参数是图片变量
    //第二个参数是字体大小
    //第三个参数是字符倾斜度,负数向左,正数向右,数值越大角度越大
    //第四个和第五个参数是字符所在位置的x坐标和y坐标
    //第六个参数是字符颜色
    //第七个参数是字体库
    //第八个参数是需要放进去的字符
    imagettftext($img, 20, 0, $x, 50, $textcolor, $font, $code);
}

//将最终的验证码存放到缓存中 cookie session
setcookie('imgcode', $imgcode); //关闭浏览器之后就没有了
// setcookie('imgcode', $imgcode, time() + 3600);

//混淆 
// 打一些像素点
for($i = 0; $i < 200; $i++)
{
    // 文字颜色
    $r = mt_rand(0, 255);
    $g = mt_rand(0, 255);
    $b = mt_rand(0, 255);
    $color = imagecolorallocate($img, $r, $g, $b);

    //位置
    $x = mt_rand(0, $width);
    $y = mt_rand(0, $height);

    // 在图片上面打像素点
    imagesetpixel($img, $x, $y, $color);
}

//加线
for($i=0; $i<10; $i++)
{
    // 文字颜色
    $r = mt_rand(0, 255);
    $g = mt_rand(0, 255);
    $b = mt_rand(0, 255);
    $color = imagecolorallocate($img, $r, $g, $b);

    //位置
    $x1 = mt_rand(0, $width);
    $y1 = mt_rand(0, $height);

    $x2 = mt_rand(0, $width);
    $y2 = mt_rand(0, $height);

    imageline($img, $x1, $y1, $x2, $y2, $color);
}


// 声明编码
// header("Content-Type:text/html;charset=utf-8");
// 声明一个图片的头信息
header("Content-Type:image/png");
//输出一张图片(资源)
// imagepng($img, "./1.png"); //保存图片
imagepng($img);